#include <iostream>
#include <string>
#include <cstdlib>

#include <signal.h>
#include <unistd.h>
#include <sys/types.h>


using namespace std;
static void Usage(const string& proc)
{
    cout<< "\nUsage: " << proc << "pid signo\n" << endl;
}
void catchSig(int signo)
{
    cout << "捕捉到信号，编号是：" << signo << endl;

    sleep(1);
}
int main(int argc,char* argv[])
{
    for(int signo = 1;signo<=31;++signo)
    {
        signal(signo,catchSig);
    }

    while(true)
    {
        cout << "我正在运行，id：" << getpid() << endl;
        sleep(4);
    }

    // //进程退出时的核心转储问题
    // while(true)
    // {
    //     int a[10] = {0};
    //     a[10000] = 10;

    // }

    // //4.软件条件产生信号
    // alarm(5);

    // size_t cloc = alarm(10);
    // cout << cloc <<endl;

    // signal(SIGALRM,catchSig);
    // int cnt = 1;
    // while(cnt)
    // {
    //     cout<< "我是一个进程，我正在执行！进程ID："<< getpid() << "cnt:"<<cnt++ << endl;
    //     cout << cloc <<endl;

    //     sleep(1);
    // }



    // //3. 硬件异常产生的信号
    // //信号的产生不一定非得用户显示的发送
    // signal(SIGSEGV,catchSig);
    // while(true)
    // {
    //     cout<< "我是一个进程，我正在执行！进程ID："<< getpid() << endl;
    //     sleep(1);
    //     int* p = nullptr;
    //     *p = 10;
    // }
    // while(true)
    // {
    //     cout<< "我是一个进程，我正在执行！进程ID："<< getpid() << endl;
    //     sleep(1);
    //     int a = 10;
    //     a /= 0;
    // }

    // //通过系统调用项目表进程发送信号
    // //kill可以给任意进程发送任意信号
    // //raise()可以给自己发送任意信号 --->kill(getpid(),signo);
    // //abort()可以给自己发送指定的6号信号  --->kill(getpid(),SIGABRT);
    // int cnt = 10;
    // while(cnt--)
    // {
    //     cout<<"cnt:" <<cnt <<endl;
    //     sleep(1);
    //     if(cnt == 5)
    //         abort();
    // }

    // int cnt = 10;
    // while(cnt--)
    // {

    //     cout<<"cnt:" <<cnt <<endl;
    //     sleep(1);
    //     if(cnt == 5)
    //         raise(3);
    // }

    // 
    // if(argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }

    // pid_t id = atoi(argv[1]); //进程id
    // int signo = atoi(argv[2]); //信号

    // int n = kill(id,signo); 
    // if(n != 0)
    // {
    //     perror("kill");
    // }
    // while(1)
    // {
    //     cout<< "我是一个进程，我正在执行！进程ID："<< getpid() << endl;
    //     sleep(1);
    // }

    return 0;
}
